package com.mtcarpenter.interview;

import com.mtcarpenter.common.Fruit;
import com.mtcarpenter.common.FruitDataTest;
import org.junit.Test;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author: mtcarpenter
 * @describe
 * @Date: 2019/10/9
 * @Version 1.0
 */
public class QuestionTest {

    /**
     * 1.使用 lambda 表达式实现 Runnable？
     */
    @Test
    public void test01() {
        System.out.println("*************  JDK 1.7 *****************");
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println(" JDK 1.7  实现 Runnable");
            }
        };
        runnable.run();

        System.out.println("*************  JDK 1.8 Lambda *****************");
        Runnable runnable2 = () -> {
            System.out.println("JDK 1.8  实现 Runnable");
        };
        runnable2.run();
    }

    /**
     * 2.使用大小 lambda 比较两个数的大小？
     */
    @Test
    public void test02() {
        System.out.println("*************  JDK 1.7 *****************");
        Comparator<Integer> comparator1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        };
        int compare1 = comparator1.compare(10, 20);
        System.out.println("10 和 20 比较：" + compare1);

        System.out.println("*************  JDK 1.8 *****************");
        Comparator<Integer> comparator2 = (o1, o2) -> Integer.compare(o1, o2);
        int compare2 = comparator2.compare(10, 10);
        System.out.println("10 和 10 比较：" + compare2);

        Comparator<Integer> comparator3 = Integer::compare;
        int compare3 = comparator3.compare(20, 10);
        System.out.println("20 和 10 比较：" + compare3);
    }

    /**
     * 3.使用 stream 打印集合中的字符串非空和空的数量？
     */
    @Test
    public void test03() {
        List<String> stringList = Arrays.asList("Java", "8", "", "新特性", "", "", "必知必会");
        // 非空字符串的数量
        long count = stringList.stream().filter(s -> !s.isEmpty()).count();
        System.out.println("集合中非空字符串的数量为：" + count);
        // 空字符串的数量
        long count1 = stringList.stream().filter(String::isEmpty).count();
        System.out.println("集合中空字符串的数量为：" + count1);
    }

    /**
     * 4.使用 stream 将集合的中的非空字符串转为list ?
     */
    @Test
    public void test04() {
        List<String> stringList = Arrays.asList("Java", "8", "", "新特性", "", "", "必知必会");
        // 非空字符串的收集
        List<String> list = stringList.stream().filter(s -> !s.isEmpty()).collect(Collectors.toList());
        list.forEach(System.out::println);
    }


    /**
     * 5.使用 stream 将集合的中的非空字符串使用 逗号（,）拼接？
     */
    @Test
    public void test05() {
        List<String> stringList = Arrays.asList("Java", "8", "", "新特性", "", "", "必知必会");
        // 非空字符串的 逗号（,）拼接
        String collect = stringList.stream().filter(s -> !s.isEmpty()).collect(Collectors.joining(","));
        System.out.println("非空字符串的 逗号（,）拼接：" + collect);
    }


    /**
     * 6.使用 stream 将集合的中偶数求和？
     */
    @Test
    public void test06() {
        List<Integer> number = Arrays.asList(5, 4, 3, 8, 6);
        // 偶数求和
        int result = number.stream().filter(x -> x % 2 == 0).reduce(0, (o1, o2) -> o1 + o2);
        System.out.println("偶数和为：" + result);
    }

    /**
     * 7.查找 水果列表中，水果 type 为 1 ，价格最高的水果名？
     */
    @Test
    public void test07() {
        List<Fruit> fruites = FruitDataTest.getFruites();
        Optional<String> optional = fruites.stream().filter(s -> s.getType() == 1).max((Comparator.comparingDouble(Fruit::getPrice)))
                .map(Fruit::getName);
        System.out.println("水果 type 为 1 价格最高的水果名为：" + optional.get());
    }

    /**
     * 8.查找 水果列表中，水果 type 为 1 ，价格最低的水果名？
     */
    @Test
    public void test08() {
        List<Fruit> fruites = FruitDataTest.getFruites();
        Optional<String> optional = fruites.stream().filter(s -> s.getType() == 1).min((Comparator.comparingDouble(Fruit::getPrice)))
                .map(Fruit::getName);
        System.out.println("水果 type 为 1 价格最低的水果名为：" + optional.get());
    }


    /**
     * 9.使用 summaryStatistics 方法，求出水果列表中价格最高，最低，总和，平均值？
     */
    @Test
    public void test09() {
        List<Fruit> fruites = FruitDataTest.getFruites();
        DoubleSummaryStatistics statistics = fruites.stream().mapToDouble(Fruit::getPrice).summaryStatistics();
        System.out.println("价高最高值为：" + statistics.getMax());
        System.out.println("价高最低值为：" + statistics.getMin());
        System.out.println("价高总和值为：" + statistics.getSum());
        System.out.println("价高平均值为：" + statistics.getAverage());
    }

    /**
     * 10.使用 java 8 格式化当前日期格式？
     */
    @Test
    public void test10() {
        LocalDateTime localDateTime = LocalDateTime.now();
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formatDateTime = localDateTime.format(format);
        System.out.println("格式化后的日期 ： " + formatDateTime);
    }


}
